import { OrderType } from '@/enums'
import { cancelOrder, deleteOrder, followOrUnfollow, getPrescriptionPic } from '@/services/consult'
import type { ConsultOrderItem, FollowType, Knowledge } from '@/types/consult'
import { showFailToast, showImagePreview, showSuccessToast } from 'vant'
import { ref } from 'vue'
// 组合式函数的定义位置，一般在composable文件夹下

/**
 *@description 关注/取消关注
 * @returns follow 逻辑方法
 * @returns isLoading加载状态
 */
export const useFollow = (type: FollowType) => {
  const isLoading = ref(false)
  // item: Knowledge 这里只设置一个类型是因为其他关注对象的结构都差不多(都有id和likeFlag属性)
  const follow = async (item: Knowledge) => {
    isLoading.value = true
    try {
      await followOrUnfollow(item.id as string, type)
      item.likeFlag = !item.likeFlag ? 1 : 0
    } finally {
      // 知识点【finally代码块】：无论接口成功失败都要把loading状态改为false，记住这种写法
      isLoading.value = false
    }
  }

  //知识点【函数式api】： 函数式api，返回值一般都会包括：数据变量、逻辑方法
  return { follow, isLoading }
}

// 查看处方大图
export const useShowPrescription = () => {
  const showPrescription = async (id?: string) => {
    if (id) {
      const res = await getPrescriptionPic(id)
      showImagePreview([res.data.url])
    }
  }
  return { showPrescription }
}

// 取消订单
export const useCancelConsultOrder = () => {
  const loading = ref(false)
  // 知识点【经验】：函数传参可以传入一个大的对象，而不是精确的某个字段，这样方便在函数内修改对象的其他字段状态值
  const cancelConsultOrder = async (item: ConsultOrderItem) => {
    try {
      loading.value = true
      await cancelOrder(item.id)
      item.status = OrderType.ConsultCancel
      item.statusValue = '已取消'
      showSuccessToast('取消成功')
    } catch {
      showFailToast('取消失败')
    } finally {
      //知识点【经验】： 在finally关闭loading，删除等操作的时候，留意一下失败的情况
      loading.value = false
    }
  }

  return { cancelConsultOrder, loading }
}

// 删除订单
// 知识点【回调函数参数】：cb是一个函数参数，可以自定义一个函数传入，在里面执行，记住这个用法
export const useDeleteConsultOrder = (cb: () => void) => {
  const delLoading = ref(false)
  const deleteOrderById = async (id: string) => {
    delLoading.value = true
    try {
      await deleteOrder(id)
      showSuccessToast('删除成功')
      cb()
    } catch {
      showFailToast('删除失败')
      delLoading.value = false
    }
  }

  return { deleteOrderById, delLoading }
}
